\documentclass[UTF8, a4paper, 10pt]{ctexart}
\usepackage[left=2.50cm, right=2.50cm, top=2.50cm, bottom=2.50cm]{geometry}

% -- text font --
% compile using Xelatex

%\setmainfont{Microsoft YaHei}  % 微软雅黑
%\setmainfont{YouYuan}  % 幼圆
%\setmainfont{NSimSun}  % 新宋体
%\setmainfont{KaiTi}    % 楷体
%\setmainfont{SimSun}   % 宋体
%\setmainfont{SimHei}   % 黑体

\usepackage{times}
%\usepackage{mathpazo}
%\usepackage{fourier}
%\usepackage{charter}
%\usepackage{helvet}

\usepackage{amsmath, amsfonts, amssymb} % math equations, symbols
\usepackage[english]{babel}
\usepackage{color}      % color content
\usepackage{graphicx}   % import figures
\usepackage{url}        % hyperlinks
\usepackage{bm}         % bold type for equations
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{epstopdf}
\usepackage{epsfig}
\usepackage{array}
\usepackage{algorithm}
\usepackage{algorithmic}
\usepackage{datetime}
\usepackage{pdfpages}
\usepackage{hyperref}   % bookmarks
%=========附录代码==========
\usepackage{listings}       % 代码环境宏包
\usepackage[toc,page,title,titletoc,header]{appendix} % 附录制作宏包
\lstset{% 代码抄录环境的设置
	tabsize=4,%
    frame=lines,%
	basicstyle={\footnotesize\ttfamily},%
    keywordstyle=\bfseries,%
    aboveskip=10pt,%
    belowskip=2pt,%
}
\hypersetup{colorlinks=true,linkcolor=black, citecolor=black, unicode} % unicode
\CTEXsetup[format={\Large\bfseries}]{section} %设置章标题字号为Large，居左
\CTEXsetup[number={\chinese{section}、}]{section}
\CTEXsetup[name={（,）}]{subsection}
\CTEXsetup[number={\chinese{subsection}}]{subsection}
\CTEXsetup[name={（,）}]{subsubsection}
\CTEXsetup[number=\arabic{subsubsection}]{subsubsection}  %以上四行为各级标题样式设置，可根据需要做修改
\renewcommand{\algorithmicrequire}{ \textbf{Input:}}     % use Input in the format of Algorithm
\renewcommand{\algorithmicensure}{ \textbf{Initialize:}} % use Initialize in the format of Algorithm
\renewcommand{\algorithmicreturn}{ \textbf{Output:}}     % use Output in the format of Algorithm
\renewcommand{\today}{\number\year 年 \number\month 月}  %中文日期
\usepackage{fancyhdr}   % 设置页眉、页脚
%\pagestyle{fancy}
\lhead{\small\leftmark}
\rhead{\small\ 第\thepage\ 页}
%\rhead{\includegraphics[width=1.2cm]{fig/ZJU_BLUE.eps}}
\lfoot{}
\cfoot{}
\rfoot{}

%\usepackage{draftwatermark}         % 所有页加水印
%\usepackage[firstpage]{draftwatermark} % 只有第一页加水印
%\SetWatermarkText{Water-Mark}           % 设置水印内容
%\SetWatermarkText{\includegraphics{fig/ZJDX-WaterMark.eps}}         % 设置水印logo
%\SetWatermarkLightness{0.9}             % 设置水印透明度 0-1
%\SetWatermarkScale{1}                   % 设置水印大小 0-1

\usepackage{hyperref}   % bookmarks
\hypersetup{colorlinks, bookmarks, unicode} % unicode
\title{\textbf{\Huge{过山车刺激程度排名研究}\\\large{——基于统计学习方法的客观评价模型}}}
\author{ 林泽佳 }

\begin{document}
% 图表标题的名称，已经合规不需要再修改
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
% 自动识别的图表文件夹，若使用这些名字命名文件夹，则引用图片路径时只需填文件名即可
\graphicspath{{./}{./img/}{./fig/}{./image/}{./figure/}{./picture/}}
    \includepdf[pages={1,2}]{header.pdf}
    % \thispagestyle{fancy}
    % \input{ABSTRACT.tex}
    \thispagestyle{empty}   % 不要页眉页脚和页码
\setcounter{page}{-100} % 此命令仅是为了避免页码重复报错，不要在意

%---------以下生成目录----------
\newpage
\renewcommand{\contentsname}{目录}
\tableofcontents
\thispagestyle{empty}   % 不要页眉页脚和页码
\newpage

%---------以下生成正文----------
% \setlength\parskip{0.8\baselineskip}  % 调整段间距
\setlength{\lineskip}{1.5em}
\setlength{\parskip}{1.5em}
\setcounter{page}{1}    % 从正文开始计页码
\pagestyle{fancy}





\section{引言}
\subsection{问题背景}
2020年是决胜全面建成小康社会和实现脱贫攻坚的关键年，十八大报告提出，要加快城乡发展一体化，决胜实现全面小康和脱贫攻坚工作。其中，对农村地区的改造和实施新农村建设是工作的重要一环。农村饮水工程经过了多年的建设、发展，已基本解决了大部分农民的饮水困难的问题。但随着乡村的进一步发展，传统的饮水方式不再适合社会发展的需要，因此要将自来水工程提到日程上来。农村地区的自来水工程对于改变农民的生产生活方式，提高生产效率和卫生质量，推进小城镇建设，具有重要意义。农村自来水工程建设是新农村建设中应当放在建设的重点，应当率先突破发展，这样才能加快城乡一体化的发展速度。

在实际的农村自来水工程中，通常要实现村与村之间的相互连通来保证可以给每一个村都提供自来水。而基于现实条件，往往需要多个多层次的供水站来实现供水，即需要提供水的中心供水站，和数量不等的一级二级站点等，也就是通过层次划分，由大容量高级别的供水站向低级供水站供水，最终由低级供水站将水输送到各个村中。

\subsection{问题重述}\label{header-n46}}

首先我们知道，在自来水管道建设和站点选择中，距离因素占了很重要的比例，选择什么样的道路，选择哪个供水站，很大程度都取决于距离的远近。在该问题中，在站点选择上我们主要是对其欧氏距离进行讨论，建立了一个关于站点间距离和管道长度的数学模型，并对于水质等可能产生影响的因素做了简短的讨论，基于此，在本文中，我们将致力于解决一下问题：

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  寻找供水站之间的连接方式，使得找出可以通过I型和II型管道完成对村和村之间的供水的最短距离。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  通过对二级站点的升级来解决II管道不足的问题，在二级站点中选取两个进行升级，使得升级后的供水站之间所需要的II型管道里程数最少。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  在问题1的前提下，考虑送水功率的影响，即在送水距离有限制的情况下，如何对部分二级站点进行升级，使得最短距离地完成供水工作
\end{enumerate}

\hypertarget{header-n51}{%
\subsection{文献回顾}\label{header-n51}}

\hypertarget{header-n122}{%
\section{模型准备}\label{header-n122}}

\hypertarget{header-n123}{%
\subsection{问题假设}\label{header-n123}}

为了简化我们的计算过程和对模型中可能存在的问题进行精确解释，我们给出了以下假设来明确题目中的部分信息，并帮助我们完成建模过程：

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  我们认为在送水过程中，站点的选择只和站点的距离和站点送水的功率有关，和水压，水质等因素无关。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  在供水过程中不会出现不可抗力的干扰，不会出现管道质量等问题，管道运载水
  的容量可以满足目标村落对水的需求。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  在供水过程中的距离均按照欧氏距离进行计算，不考虑地形，海拔等对于管道铺设的影响，铺设管道只考虑其二维模型，即两点之间在计算距离时，我们通过二维平面上的两点间距离公式进行计算，不考虑是否可能无法架设管道等问题。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  题目中的数据均为精确数据，在计算过程中出现小数均保留两位。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  运送水时无水量损失，不会影响功率。
\end{enumerate}

\hypertarget{header-n58}{%
\subsection{符号说明}\label{header-n58}}

\begin{longtable}[]{@{}cc@{}}
\toprule
符号 & 含义\tabularnewline
\midrule
\endhead
\(x\) &\tabularnewline
\(y\) &\tabularnewline
&\tabularnewline
&\tabularnewline
&\tabularnewline
&\tabularnewline
\bottomrule
\end{longtable}

\hypertarget{header-n81}{%
\section{多层次最小生成树模型}\label{header-n81}}

\hypertarget{header-n82}{%
\subsection{最小生成树}\label{header-n82}}

在建立模型之前，我们给出了一些名词解释和在建模过程中可能用到的部分知识来帮助表达我们的模型。我们通过朱刘算法来生成了一个图的最小生成树，借用这个最小生成树，我们实现了多个供水站之间的连通，并通过其两点之间的欧氏距离作为边的权值来完成计算过程。

\textbf{最小生成树：}一个有 n
个结点的连通图的生成树是原图的极小连通子图，且包含原图中的所有 n
个结点，并且有保持图\textbf{连通}的最少的边。通常可以使用克鲁斯卡尔或者普里姆算法求解。

\textbf{欧氏距离：}在数学中，\textbf{欧几里得距离}或\textbf{欧几里得度量}是指平面上两点之间的直线距离度量，可以理解为两点间的距离，可以套用两点间距离公式求解。

\textbf{prim算法：}先选中一个结点，在剩下所有结点与该节点相连的所有边中选一条最短的边，将这条新出现边的一个顶点归入这个整体中，然后在新合成的整体与剩下的所有结点的所有边中选一条最短的边，将这条新出现边的一个顶点归入这个整体中，以此类推，直到所有结点遍历完。

\textbf{朱刘算法：}用来求解出一个给定无环有向图的最小生成树，由于普里姆算法和克鲁斯卡尔算法解决的是无向图的最小生成树问题，所以对于有向图的最小生成树我们采用的是朱刘算法，其步骤为：

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  求出该图的最短弧集合，如果这个无环有向图中不包括这个最短弧集合，那么这个图的最小生成树也就不存在。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  对该最短弧集合进行检查，如果这个集合中没有有向环且不包括收缩节点，则这个集合就是最小生成树，计算过程结束；反之，对其是否有环或者是否有收缩节点分别讨论。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  如果该最短弧集合包括有向环，那么就对该有向环进行收缩，即将这个有向环收缩成一个点，对于属于该环两侧的边都收缩掉，将剩余的弧仍然保留，并将以该环为收缩终点的弧的长度进行重新计算。
\end{enumerate}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  对收缩点进行展开成环，去除掉和环具有相同终点的弧，保留剩余的弧。
\end{enumerate}

\textbf{方法综述：}为了寻找到可以实现供水站之间连通的最短路径，首先我们要保证可以将路径进行连通，即通过最短弧集合判断其是否可以构成生成树，如果可以构成生成树，我们就根据其有向环和收缩点来寻找其最小生成树。

\hypertarget{header-n93}{%
\subsection{模型建立}\label{header-n93}}

首先，我们先将一级供水站之间和一级供水站与中心供水站相连，因为他们均是采用I型管道进行运输，并且只能I型管道运输给II型管道，不能由II型管道运输给I型管道，所以II型管道的分布可能会影响到最小生成树，但不会影响有向图的结构。所以我们先实现一个普通的连通图，在这个图的基础上，通过朱刘算法筛去不需要的边即可。

基于朱刘算法，我们将prim算法的进行了部分改进，我们先对一级供水站点进行了统计，即我们先将一级站点进行计算，然后在计算基础上再将二级站点加入到计算过程中去。由于一级站点中选取的已经是最优的情况，根据贪心的策略，在加入二级站点后仍然是最优的。

\begin{figure}
\centering
\includegraphics{C:/Users/star/Desktop/校赛/1-I.png}
\caption{}
\end{figure}

由于二级站点的连接是基于一级节点的

\hypertarget{header-n99}{%
\subsection{模型求解}\label{header-n99}}

基于我们上述的计算，我们发现，不是每一个二级站点都需要和一级站点想连接，因为在不考虑功率的影响时，二级节点的相连主要取决于它相距其他节点的距离，所以二级节点并不会优先和一级节点相连，我们将连接状况展示如下。

\begin{figure}
\centering
\includegraphics{C:/Users/star/Desktop/校赛/problem_1.png}
\caption{}
\end{figure}

图中的紫色线条是I型管道的铺设路径，绿色线条是II型管道的铺设路径.在图中我们可以看出，II型管道的铺设走向主要和I型管道的分布相关，二者的分布趋势大致相同。

\hypertarget{header-n104}{%
\subsection{模型分析}\label{header-n104}}

\hypertarget{header-n161}{%
\section{II型管道优化模型}\label{header-n161}}

为了分析II型管道的长度的变化，我们首先要明确II型管道长度的分布和什么因素有关，在我们的分析过程中，由于要求出的依然是最短的路径，所以我们可以仍然采取类似问题1中的策略，仍旧采用求最小生成树的方法。

由于要把两个二级节点升级成一级节点，所以选取的升级点其辐射的范围要尽可能的大，相连的管道长度要尽可能的长，这样对点升级时，节约下来的II型管道的长度也就更长。但由于要同时考虑II型管道长度和问题1中的最小生成树，考虑的范围会增加，所以我们给出了两种解决方法。

\hypertarget{header-n107}{%
\subsection{解空间可视化}\label{header-n107}}

由于是从给定的168个二级站点中选取两个站点进行升级，所以我们可以随机选取两个二级站点进行枚举，列出所有的情况，然后从中选取出最小的值即是II型管道最短的长度。

在枚举的过程中，每一次选取两个二级节点后，我们都将其升级为一级节点，再按照问题1的解法，重新对其最小生成树进行计算，每一次算出最小生成树后，计算II型管道的长度并记录，最终得出的最小结果所对应的二级节点即是需要升级的节点。

\hypertarget{header-n110}{%
\subsection{模型描述}\label{header-n110}}

\hypertarget{header-n163}{%
\subsection{模型求解}\label{header-n163}}

遗传算法最早于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟自然选择过程所提出的一种优化模型，是一种具有完备性，健全性，非冗余性的迭代优化算法。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。根据不同的需求，可以选取不同的适应度作为判别的指标，可以在众多适应度所对应的情况中选择自己所需要的。

首先我们进行编码过程，我们将连个随机选取的二级站点x，y作为自变量指标，将升级后最小生成树的II型管道长度作为因变量。之后对于编码好的数据进行变异，由于每一次的计算过程中是以2进制编码进行存储的，所以如果让2进制中的某一位发生0和1互换，因此就会产生不同于原来的数，即会在计算过程中出现很多不同于原来的解。所以，我们可以随意选取的两个二级站点开始，通过不断迭代产生新的解。

变异结束后，通过交叉将选取的两个二级节点的坐标进行部分互换从而产生一个新的二级节点。于是，我们可以从两个不同的二级节点通过变异和互换来产生出所有的解，通过这些解可以进一步拓展搜索能力，也就可以更有目的的完成枚举过程。

\hypertarget{header-n114}{%
\subsection{模型分析}\label{header-n114}}

\begin{figure}
    \centering
    \includegraphics{C:/Users/star/Desktop/校赛/2-result.png}
    \caption{}
\end{figure}

\section{灵敏度分析}

为了检测模型的鲁棒性及泛化效果，作者从数据集中随机删除了数据集中的50组数据，并重复了4次，观察对结果的影响。在下图中可视化了排名的变化

\begin{figure}[h]
    \centering
    \includegraphics[width=14cm]{sensitivity.png}
    \caption{灵敏度分析}
\end{figure}


\section{优缺点分析}
\subsection{优点}
\begin{itemize}
    \item 在补全残缺数据时，针对缺失数量的多少采用了两种不同的方法，兼顾了精度和效率
    \item 压缩了指标的维度，使得计算更为简便
    \item CRITIC-熵权法兼顾考虑了各个指标间的离散强度和冲突性，结合了两种方法的优点
\end{itemize}

\subsection{缺点}
\begin{itemize}
    \item 由于作者水平有限，在拟合数据时采用的是最基础的神经网络，会对拟合的数据精度产生一定的影响
    \item 压缩维度时所分的4个类带有一定的主观性，这种主观性会对结果带来一定的影响
    \item 只考虑了某些指标数值上的关联（如回环数和落差），而没有对这种关联进行更深入的讨论
\end{itemize}



\renewcommand\refname{参考文献}
\begin{thebibliography}{99}
    \addcontentsline{toc}{section}{参考文献}  %引用部分标题（"Refenrence"）的重命名
    \bibitem{1}Coaster Peadia.2019\texttt{\\https://coasterpedia.net/}
    \bibitem{grey}刘思峰.离散GM (1, 1) 模型与灰色预测模型建模机理[J].系统工程理论与实践.2005(5):2
    \bibitem{forest}钱超，陈建勋，罗彦斌等.基于随机森林的公路隧道运营缺失数据插补方法[J].交通运输系统工程与信息.2016(6):82
    \bibitem{bp}李寒雨.基于迭代决策树和BP神经网络的目标威胁估计研究[D].北京：中国船舰研究院.2018:37-38
    \bibitem{julei}吴玲达，蔡益朝.数据挖掘中的聚类算法综述[J].计算机应用研究.2007(1):10-11
    \bibitem{critic}吴忠，关娇，何江.最低工资标准测算实证研究[J].当代经济科学.2019(3):193-117
    \bibitem{good}陶长琪，陈文华，林龙辉．我国产业组织演变协同度的实证分析——以企业融合背景下的我国IT产业为例[J].管理世界，2007(12)：67—72.
    \bibitem{tichu}Diakoulaki D，Mavrotas G，Papayannakis L．Determining objective weights in multiple criteria problems：The CRITIC method[J].Computers＆Operations Research，1995，22(7)：763—770．
    \bibitem{cluster}李航.统计学习方法[M].北京：清华大学出版社，2012：255-261
    \bibitem{xigua}周志华.机器学习[M].北京：清华大学出版社，2016：99-106
    \bibitem{bpnn}Wikipedia:Back Propagation Neural Network.2019\texttt{\\https://en.wikipedia.org/wiki/Backpropagation}
    \bibitem{node}王嵘冰，徐红艳，李波.BP神经网络隐含层节点数确定方法研究[J].计算机技术与发展.2018(4):32
\end{thebibliography}


% ==============以下为附录内容，如您的论文中不需要程序附录请自行删除====================
\clearpage
\begin{subappendices}						% 附录环境
\section*{附录1：源代码}		% 附录标题可以自行修改
\addcontentsline{toc}{section}{附录}  	% 将附录内容加入到目录中

\subsection*{层次聚类}

本PYTHON程序用于实现层次聚类
\begin{lstlisting}[language=python, caption=\texttt{cluster.py}]
    import matplotlib.pylab as plt
    import scipy.cluster.hierarchy as sch
    from myUFunc import *

    points, fake = readMatrix('data/in.txt', 3, 0)

    # 加一个标签进行区分
    A = []
    for i in range(301):
        # a = chr(i + ord('A'))
        A.append(i)

    # 层次聚类，生成点与点之间的距离矩阵,这里用的欧氏距离
    disMat = sch.distance.pdist(points, 'euclidean')

    # 进行层次聚类:
    Z = sch.linkage(disMat, method='average')
    np.set_printoptions(threshold=np.inf)

    sch.set_link_color_palette(['#44B5F3'])
    P = sch.dendrogram(Z, labels=A)
    locs, ticks = plt.xticks()
    num = []
    for i in ticks:
        num.append(int(plt.Text.get_text(i)))
    plt.xticks(locs, ticks)

    for i in range(1, 79):
        loc=locs[num.index(i)]
        plt.plot([loc, loc], [0, 3],
                 color='r', linewidth=0.6, linestyle="--")

    plt.show()
\end{lstlisting}

\subsection*{BPNN}

本PYTHON程序用于实现BPNN
\begin{lstlisting}[language=python, caption=\texttt{BPNN.py}]
    import os
    import matplotlib.pyplot as plt
    import tensorflow.compat.v1 as tf

    from myUFunc import *

    if __name__ == '__main__':

        os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
        tf.disable_v2_behavior()

        '''超参数'''
        inCnt = 6
        outCnt = 1
        iterTime = 80001
        learningRate = 0.015
        saveTime = 2500
        printTime = 250

        '''测试数据'''
        x, y = readMatrix('data/in.txt', inCnt, outCnt)
        x_test, y_test = readMatrix('data/test.txt', inCnt, outCnt)
        x_pred, zhanwei = readMatrix('data/pred.txt', inCnt, 0)
        training_loss = []  # 记录损失函数
        testCha = []  # 记录测试集的差值

        '''初始化神经网络'''
        tf_x = tf.placeholder(tf.float32, [None, inCnt])  # input x
        tf_y = tf.placeholder(tf.float32, [None, outCnt])  # input y

        '''定义层数'''
        l1 = tf.layers.dense(tf_x, 5, tf.nn.relu)  # hidden layer
        l2 = tf.layers.dense(l1, 7, tf.nn.relu)  # hidden layer
        l3 = tf.layers.dense(l1, 5, tf.nn.relu)  # hidden layer
        output = tf.layers.dense(l3, 1)  # output layer

        '''配置运行参数'''
        loss = tf.losses.mean_squared_error(tf_y, output)  # compute cost
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=learningRate)
        train_op = optimizer.minimize(loss)

        '''开机!'''
        sess = tf.Session()  # control training and others
        sess.run(tf.global_variables_initializer())  # initialize var in graph

        '''迭代'''
        for step in range(iterTime):
            _, l, pred = sess.run([train_op, loss, output], {tf_x: x, tf_y: y})
            training_loss.append(l)
            if step % printTime == 0:
                print('step ' + str(step) + ' : ' + str(l))

        '''测试集'''
        fw = open('data/test_result.txt', 'w')
        output_test = sess.run(output, {tf_x: x_test})
        for i, j, k in zip(x_test, output_test, y_test):
            testCha.append(j[0] - k[0])
            fw.write(str(j[0] - k[0]) + '\n')
            # print('input is:' + str(i[:]))

        '''预测'''
        fw = open('data/result.txt', 'w')
        output_test = sess.run(output, {tf_x: x_pred})
        for i, j in zip(x_pred, output_test):
            fw.write(str(j[0]) + '\n')
            # print(str(j[0]))

        '''画图'''
        plt.plot(range(iterTime), training_loss)
        plt.title('Loss Function')
        plt.show()
        plt.plot(range(len(testCha)), testCha)
        plt.show()
\end{lstlisting}

\subsection*{辅助程序}

本PYTHON程序用于提供必要的辅助函数
\begin{lstlisting}[language=python, caption=\texttt{myUFunc.py}]
import matplotlib.pyplot as plt
import numpy as np

def readMatrix(filePath, xcnt, ycnt):
    '''
    从文件中读取输入输出矩阵

    :param filePath: 文件路径
    :param xcnt: 输入向量维数
    :param ycnt: 输出向量维数
    :return: 输入矩阵，输出矩阵
    '''
    fr = open(filePath)
    xmtx = []  # 输入矩阵
    ymtx = []  # 输出矩阵
    data = fr.readlines()
    column = len(data[0].strip().split(','))  # 列数
    row = len(data)  # 行数
    index = 0
    mtx = np.zeros((row, column))  # 构造n*n全零矩阵
    for line in data:
        item = line.strip().split('\t')  # 读取每一行数据
        xvec = []  # 一组输入向量
        yvec = []  # 一组输出向量
        for i in range(xcnt):
            # value = Fraction(item[i]) + 0.0
            xvec.append(float(item[i]))
        for i in range(xcnt, xcnt + ycnt):
            yvec.append(float(item[i]))
        xmtx.append(xvec)
        ymtx.append(yvec)
        # mtx[index, :] = ret[0:column]  # 将每行结果赋值到全零矩阵
        # index += 1
    return xmtx, ymtx

def drawBar():
    pos = []
    neg = []
    data = []
    n = int(input('number of data sets\n'))
    title = input('title\n')
    for i in range(n):
        tmp = float(input())
        data.append(tmp)
        if tmp > 0:
            pos.append(tmp)
            neg.append(0)
        else:
            pos.append(0)
            neg.append(tmp)

    aver = np.average(data)
    stdev = np.std(data)

    x = np.arange(n)
    plt.bar(x, pos, facecolor='#9999ff', edgecolor='white')
    plt.bar(x, neg, facecolor='#ff9999', edgecolor='white')

    for i, y in zip(x, pos):
        if y > 0:
            plt.text(i, y + 0.05, '%.2f' % y, ha='center',
                va='bottom', fontdict={'fontsize': 8})

    for i, y in zip(x, neg):
        if y < 0:
            plt.text(i, y - 0.05, '%.2f' % y, ha='center',
                 va='top', fontdict={'fontsize': 8})

    plt.text(10,-0.5,r'\bar X=%.2f'%aver)

    plt.title(title + ' Test Data Set\' Error')
    plt.xticks([])
    plt.show()

\end{lstlisting}

\section*{附录2：数据集}
见下页
\newpage
\includepdf[pages={1,2,3,4}]{database.pdf}

\end{subappendices}






\end{document}